home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / pcxkit.zip / HOEDOWN.PAS < prev    next >
Pascal/Delphi Source File  |  1992-01-06  |  4KB  |  152 lines

  1.  
  2. program HOEDOWN;
  3.  
  4. (* Demonstration of animation against a backdrop. See CLIP.DOC.
  5.  
  6.    Before compiling this program, set the "pathtodrivers" constant
  7.    to the directory where your .BGI files reside. *)
  8.  
  9. uses
  10.   Graph,
  11.   Crt;
  12.  
  13. const
  14.   pathtodrivers = 'C:\TP\BGI';
  15.   datafile = 'HOEDOWN.DTA';
  16.   step = 10;                           (* Governs lateral motion of figure *)
  17.   ypos = 100;                          (* Top line of images *)
  18.  
  19. type
  20.   imagetype = record
  21.                 width,
  22.                 height,
  23.                 size,
  24.                 xpos : integer;
  25.                 image,
  26.                 backdrop : pointer;
  27.               end;
  28.  
  29. var
  30.   grdriver,
  31.   grmode,
  32.   grerror : integer;
  33.  
  34.   pal : palettetype;
  35.  
  36.   icon_file : file;
  37.  
  38.   x,
  39.   page : integer;
  40.  
  41.   Clem : array[0..1] of imagetype;
  42.  
  43.   bales : imagetype;
  44.  
  45.   junk : char;
  46.  
  47. (* ----------------------------------------------------------------------- *)
  48.  
  49.   procedure GET_ICON(var pic : imagetype);
  50.   begin
  51.     with pic do
  52.       begin
  53.         blockread(icon_file, width, 2); (* Dimensions first *)
  54.         blockread(icon_file, height, 2);
  55.         size := imagesize(0, 0, width, height);
  56.         getmem(image, size);           (* Allocate dynamic memory *)
  57.         getmem(backdrop, size);
  58.         seek(icon_file, filepos(icon_file) - 4);
  59.         blockread(icon_file, image^, size); (* Store the image *)
  60.       end
  61.   end;
  62.  
  63. (* ----------------------------------------------------------------------- *)
  64.  
  65. BEGIN
  66.  
  67. (* Open data file and quit if not found. The file consists of the palette
  68.    record followed by three images - two of the dancing man and one of
  69.    the bales that form the backdrop. *)
  70.  
  71.   assign(icon_file, datafile);
  72.   {$I-}
  73.   reset(icon_file, 1);
  74.   {$I+}
  75.   if (ioresult <> 0) then
  76.     begin
  77.       writeln('File ', datafile, ' not found.');
  78.       halt
  79.     end;
  80.  
  81.   (* Initialize graphics *)
  82.  
  83.   grmode := egahi;
  84.   grdriver := ega;
  85.   initgraph(grdriver, grmode, pathtodrivers);
  86.   grerror := graphresult;
  87.   if (grerror <> 0) then
  88.     begin
  89.       writeln('Graphics error: ', grapherrormsg(grerror));
  90.       halt
  91.     end;
  92.  
  93.   (* Read the palette from file and set the colors *)
  94.  
  95.   blockread(icon_file, pal, 17);
  96.   setallpalette(pal);
  97.  
  98.   (* Initialize the position of the images *)
  99.  
  100.   Clem[1].xpos := 590;
  101.   Clem[0].xpos := Clem[1].xpos - step div 2;
  102.  
  103.   (* Get the images into memory *)
  104.  
  105.   for x := 0 to 1 do
  106.     GET_ICON(Clem[x]);
  107.   GET_ICON(bales);
  108.   close(icon_file);
  109.  
  110. (* Draw the scenic backdrop on both video pages, and store the part
  111.    that will be written to the screen when the loop is entered *)
  112.  
  113.   for page := 0 to 1 do
  114.     with bales do
  115.       begin
  116.         xpos := 20;
  117.         setactivepage(page);
  118.         setvisualpage(page xor 1);
  119.         repeat
  120.           putimage(xpos, ypos, image^, copyput);
  121.           inc(xpos, width);
  122.         until (xpos > getmaxx);
  123.         with Clem[page] do
  124.           getimage(xpos, ypos, xpos + width, ypos + height, backdrop^)
  125.       end;
  126.  
  127. (* Now flip between the two video pages. While one page is being viewed,
  128.    update the other. First copy the stored backdrop over the dancing
  129.    figure, then increment his position, then store the backdrop at
  130.    his new position, and finally redraw him. *)
  131.  
  132.   page := 1;
  133.   repeat
  134.     with Clem[page] do
  135.       begin
  136.         setactivepage(page);
  137.         setvisualpage(page xor 1);
  138.         putimage(xpos, ypos, backdrop^, copyput);
  139.         dec(xpos, step);
  140.         if (xpos < 0) then
  141.           xpos := 590;
  142.         getimage(xpos, ypos, xpos + width, ypos + height, backdrop^);
  143.         putimage(xpos, ypos, image^, orput);
  144.         delay(200);
  145.         page := page xor 1
  146.       end
  147.   until keypressed;
  148.   junk := readkey;                     (* Discard keypress *)
  149.   closegraph
  150. END.
  151.  
  152.